#pragma once
#include "core_headers.hpp"
#include "LoopThread.hpp"
#include "EventLoop.hpp"

// 争对LoopThread设计线程池
class LoopThreadPool
{
public:
	LoopThreadPool(EventLoop *loop)
		: _thread_count(0), _next_loop_idx(0), _baseloop(loop)
	{
	}
	// 设置从属线程数量
	void SetThreadCount(int count)
	{
		_thread_count = count;
	}
	// 创建所有从属线程
	void Create()
	{
		if (_thread_count > 0)
		{
			_threads.resize(_thread_count);
			_loops.resize(_thread_count);
			for (int i = 0; i < _thread_count; i++)
			{
				_threads[i] = new LoopThread();
				_loops[i] = _threads[i]->GetLoop();
			}
		}
		return;
	}
	// 分配EventLoop
	EventLoop *NextLoop()
	{
		if (_thread_count == 0)
		{
			return _baseloop;
		}
		_next_loop_idx = (_next_loop_idx + 1) % _thread_count;
		return _loops[_next_loop_idx];
	}

private:
	int _thread_count;					// 线程数量
	int _next_loop_idx;					// 分配出去的eventLoop的指针数组下标
	EventLoop *_baseloop;				// 主线程
	std::vector<LoopThread *> _threads; // 保存所有的LoopThread对象
	std::vector<EventLoop *> _loops;	// 从属线程大于0，则从_loop中进行线程EventLoop分配
};